package cn.buk.qms.service;

import cn.buk.api.azure.BlobService;
import cn.buk.api.wechat.entity.WeixinEntConfig;
import cn.buk.api.wechat.entity.WeixinServiceConfig;
import cn.buk.common.JsonResult;
import cn.buk.common.dto.CommonDto;
import cn.buk.common.sc.CommonSearchCriteria;
import cn.buk.tms.dto.*;
import cn.buk.tms.dto.SupplierDto;
import cn.buk.tms.entity.config.EtermEntConfig;
import cn.buk.tms.sc.SearchCustomerCriteria;
import cn.buk.tms.admin.EntAlipayCfgDto;
import cn.buk.tms.common.dto.*;
import cn.buk.tms.dto.CustomerFlightDiscountDto;
import cn.buk.tms.entity.misc.*;

import java.util.Date;
import java.util.List;
import java.util.Optional;

/**
 * @author yfdai
 */
public interface EnterpriseService {

  /**
   * 获取Enterprise信息
   *
   * @param enterpriseId 企业id
   * @return 企业信息对象
   */
  Enterprise getEnterpriseById(int enterpriseId);

  List<EntBalanceDto> searchCustomerBalances(int enterpriseId, SearchCustomerCriteria sc);

  JsonResult updateEntCashBalance(int enterpriseId, int objectEnterpriseId, int opMode, int modifyAmount, String remark);

  JsonResult buyPoints(int enterpriseId);

  JsonResult createEntCreditLimit(int enterpriseId, int authorizee, int creditLimit);

  List<PassengerDto> searchPsgInfo(int enterpriseId, int userId, SearchCustomerCriteria sc);

  PassengerDto getPassengerInfo(int enterpriseId, int id);

  /**
   * 保存乘机人信息
   */
  JsonResult savePsgInfo(int enterpriseId, int userId, String username, PassengerDto psgInfo);


  List<CustomerDepartmentDto> searchCustomerDepartments(int enterpriseId, SearchCustomerCriteria sc);

  JsonResult saveCustomerDepartment(int enterpriseId, int userId, CustomerDepartment department);

  String getCtripAllianceSiteId(final int enterpriseId);

  String getRedmineUrl(final int enterpriseId);


  /**
   * 查找供应商
   */
  List<SupplierDto> searchSuppliers(int enterpriseId, CommonSearchCriteria sc);

  SupplierDto searchSupplier(int enterpriseId, int id);

  /**
   * 保存或修改供应商资料
   */
  JsonResult createSupplier(final int enterpriseId, final String username, Supplier info);

  /**
   * 查找支出支付方式
   */
  List<PaymentMethodDto> searchPaymentMethods(int enterpriseId, CommonSearchCriteria sc);

  List<IncomeMethodDto> searchIncomeMethods(int enterpriseId, CommonSearchCriteria sc);

  JsonResult createPaymentMethod(int enterpriseId, PaymentMethod info);

  JsonResult createIncomeMethod(int enterpriseId, IncomeMethod o);

  List<CustomerDepartment> searchDepartmentsByCustomer(int enterpriseId, int customerId);

  /**
   * 查找 组
   */
  List<GroupDto> searchGroups(int enterpriseId, CommonSearchCriteria sc);

  JsonResult createGroup(int enterpriseId, int userId, String groupName);

  JsonResult updateGroupRole(int enterpriseId, int userId, int groupId, String roleName);

  /**
   * 将用户加入组
   */
  JsonResult addUserToGroup(int enterpriseId, int userId, int paramUserId, int groupId);

  JsonResult deleteUserFromGroup(int enterpriseId, int userId, int paramUserId, int groupId);

  List<RoleInfo> searchRoles(int enterpriseId);

  /**
   * 查找角色对应的权限
   */
  CommonDto<RolePrivilege> searchRolePrivileges(int enterpriseId, CommonSearchCriteria sc);

  /**
   * 删除角色对应的权限
   *
   * @param enterpriseId 当前用户的enterpriseId
   * @param id           角色资源的id
   */
  JsonResult deleteRolePrivilege(int enterpriseId, int id);

  /**
   * 增加角色对应的权限
   *
   * @param enterpriseId 当前用户的enterpriseId
   * @param role         角色
   * @param privilegeIds 资源的id
   * @return 操作是否成功的JsonResult对象
   */
  JsonResult addRolePrivilege(int enterpriseId, String role, Integer[] privilegeIds);

  List<SysPrivilege> searchPrivileges(int enterpriseId);

  List<CustomerNote> searchCustomerNotes(int enterpriseId, CommonSearchCriteria sc, final int customerId, final int noteType);

  JsonResult createCustomerNote(int enterpriseId, int customerId, int noteType, String name);

  /**
   * 查找企业客户的订单备注
   */
  List<CustomerNote> searchCustomerNotesByType(int enterpriseId, int customerId, int noteType);

  JsonResult deleteCustomerNoteById(int enterpriseId, int id);


  List<AirlinesDto> searchAirlines(int enterpriseId, CommonSearchCriteria sc);


  CommonDto<FakeTicketNo> searchFakedTickets(int enterpriseId, CommonSearchCriteria sc);

  JsonResult createFakedTicket(int enterpriseId, String twoCode);

  CommonDto<EntDepartment> searchEntDepartments(int enterpriseId, CommonSearchCriteria sc);

  /**
   * 新建或修改部门
   *
   * @param enterpriseId 企业id
   * @param username     用户名
   * @param id           本系统的部门id
   * @param name         部门名称
   * @param role         部门的默认角色
   * @param parentId     企业微信的上级部门id
   * @param wwDeptId     企业微信的部门id
   * @param remark       备注
   */
  JsonResult createDepartment(int enterpriseId, String username, int id, String name, String role, int parentId, int wwDeptId, String remark);

  /**
   * 删除部门
   */
  JsonResult deleteDepartment(int enterpriseId, String username, int id);

  void createOrUpdateWwUser(int enterpriseId, String username, String name, String email, String mobileNo, String etermUsername, String position);

  EntDepartment getEntDepartmentById(int enterpriseId, int id);

  JsonResult validateWwUser(User u, String wwCode, String remoteAddress);

  JsonResult deleteWwUser(int enterpriseId, int id, String remark);

  /**
   * 同步企业微信指定部门的用户
   *
   * @param enterpriseId 企业id
   * @param id           部门id
   * @return 通过结果
   */
  JsonResult syncWwDeptUsers(int enterpriseId, int id);


  List<FuelSurcharge> searchFuelSurcharges(int enterpriseId, CommonSearchCriteria sc);

  JsonResult createFuelSurcharge(int enterpriseId, int mileageType, Date effectDate, int surcharge);

  JsonResult deleteFuelSurcharge(int enterpriseId, int id);

  JsonResult createCustomerByEnterprise(int enterpriseId, int customerEnterpriseId);


  JsonResult deletePassengerInfo(int userId, int id);

  String searchCnAirports();

  void cleanDuplicatePassenger(int enterpriseId);

  /**
   * 检查购买产品是否过了使用期限
   */
  JsonResult checkProductExpireDate(int enterpriseId, String productCode);

  EnterpriseConfigDto searchEntConfig(int enterpriseId);

  JsonResult updateWorkTime(int enterpriseId, String workDay, String workBeginTime, String workEndTime, String receivingAccount);

  void updateEntConfig(int enterpriseId, String configKey, String configValue);

  /**
   * 查找旅行代码
   */
  List<PnrTourCode> searchTourCodes(final int enterpriseId);

  /**
   * 修改或创建旅游代码
   */
  JsonResult createOrUpdateTourCode(int enterpriseId, String username, PnrTourCode pnrTourCode);

  /**
   * 查找eterm参数
   */
  EtermEntConfig searchEtermConfig(int enterpriseId);

  /**
   * 保存eterm参数
   */
  JsonResult saveEtermConfig(int enterpriseId, String host, int port, String username, String password);

  /**
   * 设置为默认供应商
   */
  JsonResult setDefaultSupplier(int enterpriseId, int supplierId);

  /**
   * 设置BSP供应商
   *
   * @param enterpriseId 企业id
   * @param supplierId   供应商id
   * @param bspType      自动开票类型
   * @return JsonResult结果
   */
  JsonResult setBspSupplier(int enterpriseId, int supplierId, int bspType);

  /**
   * 将企业微信的部门信息同步到本地
   */
  JsonResult syncEntDepartments(int enterpriseId);

  /**
   * 将企业微信的成员内容同步到本地
   */
  JsonResult syncWwUser(int enterpriseId, int id);


  Date getEntExpireDate(int enterpriseId);


  List<DataFieldInfo> searchDataFields();

  JsonResult createDataTemplate(int enterpriseId, DataTemplateDto dto);

  List<DataFieldExportTemplate> searchDataTemplates(int enterpriseId, CommonSearchCriteria sc);

  DataFieldExportTemplate searchDataTemplate(int enterpriseId, int templateNo);

  JsonResult deleteDataTemplateById(int enterpriseId, int id);

  SmsConfigDto searchSmsConfig(final int enterpriseId);

  VaasConfigDto searchVaasConfig(final int enterpriseId);

  /**
   * 查找系统订单参数设置
   */
  OrderConfigDto searchOrderConfig(int enterpriseId);

  JsonResult updateVaasConfig(int enterpriseId, String username, String url, String apiUsername, String secretKey);

  JsonResult updateSmsConfig(int enterpriseId, String username, String companySign, String url, String accessKey, String secretKey);

  /**
   * 修改系统订单参数设置
   */
  JsonResult updateOrderConfig(int enterpriseId, String username, OrderConfigDto configDto);

  /**
   * 根据客人名字查找可能所属的公司
   */
  String[] searchPossibleCustomers(int enterpriseId, PassengerDto[] dtos);

  /**
   * 刷新企业客户最新一次购买时间
   */
  void refreshCustomerRecency();


  /**
   * 更新供应商最近三个月的使用频次
   */
  void refreshSupplierFrequency();

  /**
   * 将订单中的客户资料导入
   */
  JsonResult importPassengers(int enterpriseId);

  /**
   * 导入乘机人手机号
   *
   * @param maxSeconds 每次执行时间的上限，单位：秒
   */
  void importPassengerMobiles(int enterpriseId, String username, int maxSeconds);


  /**
   * 保存基础数据到redis
   */
  void saveBasicData2Redis();

  /**
   * 保存业务数据到REDIS
   */
  void saveBusinessData2Redis();

  /**
   * 查找加价设置
   */
  MarkupConfigDto searchMarkupConfig(int enterpriseId);

  /**
   * 修改全局加价
   *
   * @param hotelMarkup        酒店加价
   * @param carMarkup          用车加价
   * @param boardingCardMarkup 登机牌加价
   * @param domFlightMarkup    国内机票加价
   * @param intlFlightMarkup   国际机票加价
   */
  JsonResult saveMarkupConfig(int enterpriseId, int hotelMarkup, int carMarkup, int boardingCardMarkup,
                              int domFlightMarkup, int intlFlightMarkup);

  /**
   * 查找客户的优惠信息
   *
   * @param enterpriseId 企业id
   * @param id           客户id
   */
  CustomerDiscountInfoDto getCustomerDiscountInfo(int enterpriseId, int id);

  /**
   * 查找客户的航班查询控制信息
   */
  CustomerAvCountInfoDto getCustomerAvCountInfo(int enterpriseId, int id);

  /**
   * 保存客户的优惠信息
   */
  JsonResult saveCustomerDiscountInfo(int enterpriseId, int customerId,
                                      int hotelDiscount, int carDiscount, int boardingCardDiscount,
                                      int domFlightDiscount, int intlFlightDiscount);

  /**
   * 查找客户的机票优惠信息
   */
  List<CustomerFlightDiscountDto> searchCustomerFlightDiscounts(int enterpriseId, int customerId);

  /**
   * 保存/删除 客户能用的机票优惠信息
   */
  JsonResult saveCustomerFlightDiscount(int enterpriseId, int customerId, String policyCode, int commRateRetained, int mode);

  /**
   * 创建车型组信息
   */
  JsonResult createVehicleGroupInfo(int enterpriseId, String username, VehicleGroupInfoDto dto);

  /**
   * 查找车型组信息
   */
  List<VehicleGroupInfoDto> searchVehicleGroups(int enterpriseId, CommonSearchCriteria sc, int mapping);

  /**
   * 创建车型组映射（与供应商的车型组id匹配）
   */
  JsonResult createVehicleGroupMapping(int enterpriseId, String username, int vehicleId, int supplierId, int supplierVehicleId);

  /**
   * 获取企业部门信息
   */
  CustomerDepartmentDto getCustomerDepartmentById(int enterpriseId, int id);

  JsonResult saveCustomerPosition(int enterpriseId, int userId, CustomerPosition dto);

  List<CustomerPositionDto> searchCustomerPositions(int enterpriseId, SearchCustomerCriteria sc);

  /**
   * 为企业用户的员工生成登录信息
   *
   * @param userId 当前用户id
   */
  JsonResult generatePassengerLoginInfo(int userId, int psgId);

  JsonResult saveApiProductSupplier(int enterpriseId, int productType, int supplierId);

  List<ProductDefaultSupplier> searchApiProductSupplier(int enterpriseId);

  JsonResult deleteApiProductSupplier(int enterpriseId, int id);

  /**
   * 从Excel中导入乘机人资料
   *
   * @param enterpriseId 当前企业ID
   * @param username     当前用户名
   * @param filePath     文件路径
   * @param customerId   企业客户id
   */
  JsonResult importPassengersByExcel(int enterpriseId, String username, String filePath, int customerId);

  /**
   * 将已有的乘机人英文名字中的姓和名分开存
   */
  void splitPassengerEnglishName(int ownerId, String agentName);

  /**
   * 查找客户服务分组
   */
  List<GroupCustomerService> searchCustomerServiceGroups(int enterpriseId);

  /**
   * 创建或修改 客服服务分组
   */
  JsonResult createOrUpdateCustomerServiceGroup(int enterpriseId, String username, int id, String code, String name);

  /**
   * 保存客户的分组信息
   */
  JsonResult updateCustomerGroup(int enterpriseId, String username, int customerId, int groupId);

  JsonResult deleteCustomerGroup(int enterpriseId, String username, int customerId);

  /**
   * 保存客服代表的分组信息
   */
  JsonResult updateRepresentativeGroup(int enterpriseId, String username, int userId, int groupId);

  JsonResult deleteRepresentativeGroup(int enterpriseId, String username, int userId);

  /**
   * 查找客户服务费模板
   *
   * @param enterpriseId 企业id
   */
  List<CustomerServiceTemplateDto> searchCustomerServiceTemplates(int enterpriseId);

  /**
   * 创建或修改客户服务费模板
   */
  JsonResult createOrUpdateCustomerServiceTemplate(int enterpriseId, String username, CustomerServiceTemplate tpl);

  CustomerServiceTemplateDto getCustomerServiceTemplateById(int enterpriseId, String username, int id);

  /**
   * 修改客户适用的服务模板
   *
   * @param enterpriseId 企业id
   * @param username     用户名
   * @param customerId   客户id
   * @param templateId   服务模板id
   * @param templateCode 服务模板代码
   */
  JsonResult updateCustomerTemplate(int enterpriseId, String username, int customerId, int templateId, String templateCode);

  /**
   * 获取指定客户适用的服务费模板
   */
  Optional<CustomerServiceTemplateDto> searchServiceTemplateByCustomer(int enterpriseId, int customerId);

  /**
   * 生成Blob服务类
   */
  Optional<BlobService> createBlobService(int enterpriseId);

  /**
   * 获取Blob存储容器名称
   */
  String getBlobStorageContainerName(int enterpriseId);

  /**
   * 保存上传文件名和BLOB名称的映射
   *
   * @param enterpriseId 企业id
   * @param username     用户名
   * @param fileName     上传的文件的原始用户名
   * @param blobName     blob名称
   * @param contentType  文件类型
   * @param fileSize     文件尺寸
   */
  int saveFileNameMapping(int enterpriseId, String username, String fileName, String blobName, String contentType, long fileSize);

  List<TmsTask> searchTasks(int enterpriseId, CommonSearchCriteria sc);

  void createDailyAuditTask(int enterpriseId, String username);

  JsonResult finishDailyTask(int enterpriseId, String username, int taskId);

  /**
   * 再次发送日审核任务完成后的文件
   */
  JsonResult resendDailyTask(int enterpriseId, String username, int taskId);

  /**
   * 查找报表模板信息
   */
  List<ReportTemplateInfo> searchReportTemplates(int enterpriseId);

  /**
   * 修改客户适用的报表模板
   */
  JsonResult updateCustomerReportTemplate(int enterpriseId, String username, int customerId, int templateId);

  /**
   * 修改客户服务模板的机票规则
   *
   * @param templateId 模板id
   * @param fltRule    机票规则
   */
  JsonResult createOrUpdateCustomerServiceFlightRule(int enterpriseId, String username, int templateId, CustomerServiceFlightRule fltRule);

  /**
   * 保存乘机人适用的机票私有政策
   */
  JsonResult savePassengerFlightKeyCustomerPolicy(int enterpriseId, String username, int[] psgIds, int[] policyIds);

  /**
   * 移除某条乘机人适用的机票政策
   */
  JsonResult removePassengerFlightPolicy(int enterpriseId, String username, int psgId, int policyId);

  /**
   * 保存对企业客户的航班查询次数的控制信息
   */
  JsonResult saveCustomerAvCountInfo(int enterpriseId, int customerId, int maxTotal, int maxMonthly);

  /**
   * 更新航班查询次数统计信息
   */
  void updateFlightSearchStat(FlightSearchStatDto dto);

  /**
   * 查找微信公众号开发参数
   */
  WeixinServiceConfig searchWeixinServiceConfig(int enterpriseId);

  /**
   * 保存微信公众号开发参数
   */
  JsonResult updateWeixinServiceConfig(int enterpriseId, String username, String appId, String appSecret, String token, String encodingKey);

  JsonResult updateWorkWeixinConfig(int enterpriseId, String username, String corpId, int msgType, int agentId, String agentSecret, String token, String encodingKey);

  /**
   * 企业微信的开发参数
   */
  List<WeixinEntConfig> searchWorkWeixinConfig(int enterpriseId);

  List<TmsWwAppChat> searchWwAppChats(int enterpriseId);

  JsonResult createWwAppChat(int enterpriseId, TmsWwAppChat appChat);

  List<TmsWwUser> searchWwUsers(int enterpriseId);

  TmsWwAppChat searchWwAppChat(int enterpriseId, String chatId);

  TmsWwAppChat searchWwAppChatByType(int enterpriseId, String qtype);

  void sendAlertMessage(int enterpriseId, String content);

  JsonResult updateAlipayConfig(int enterpriseId, String username, String mainAccount, String appId, String privateKey, String alipayPublicKey, String returnUrl, String notifyUrl);

  List<EntAlipayCfgDto> searchAlipayConfigs(int enterpriseId);

  JsonResult deleteAlipayConfig(int enterpriseId, String username, int id);

  /**
   * 查找TMS供应商
   * @param enterpriseId
   * @return
   */
  List<TmsSupplierDto> searchTmsSuppliers(int enterpriseId);
}
